<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.js"></script>
    <!-- <script src="lodash.js"></script> -->
    <script>
        // 1.简单数据类型的浅拷贝
        // b会开辟一个新的空间，与a互相不影响
        // let a = 2;
        // let b = a;
        // a = 10;
        // console.log(a);//10
        // console.log(b);//2

        // 2.复杂数据类型的浅拷贝
        // 这个时候b复制的a的引用地址，而不是堆中的值，a和b指向的是一个地方
        // 所以改变a的值b也会变
        // let a = [1,2,3];
        // let b = a;
        // a[0] = 100;
        // console.log(a); //[100, 2, 3]
        // console.log(b); //[100, 2, 3]

        // 3.复杂数据类型的深拷贝
        // JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
        // JSON.parse() 方法将数据转换为 JavaScript 对象。
        // 方法1
        // 写法1
        // let a = {"name":"la","age":18};
        // let b = JSON.stringify(a);
        // console.log(b);
        // let c = JSON.parse(b);
        // a.age = 28;
        // console.log(a);
        // console.log(c);

        // 写法2
        // let a = {"name":"la","age":18};
        // var b = JSON.parse(JSON.stringify(a));
        // b.name = "dada";
        // console.log(a);
        // console.log(b);

        // 方法2
        var obj = {"a":1,"b":2};
        var deep = _.cloneDeep(obj);
        deep.a = 100;
        console.log(obj,deep);


        // 方法3
        // 深拷贝，实现对象中的所有属性的数值拷贝，而不是引用拷贝
        //  instanceOf 用于判断是否是一个对象的实例 用于判断复杂数据类型
        //  typeOf 判断简单数据类型
        var obj1 = {
            a:{
                a:{
                    b:1
                }
            },
            d:2,
            e:3,
            f: [1,2,3,4,5,6,7],
            g: function(){
                console.log(this.a)
            }
        }
        var obj = new Object()
        // 第一种方法
        function deepCopy(target, source) {
            for(var key in source) {
            //   console.log('key', key);
            //   console.log('value', source[key]);
                if (source[key] instanceof Object && !source[key] instanceof Function) {
                    console.log('--object--', source[key])
                    if(source[key] instanceof Array) {
                        console.log('--Array--', source[key])
                        target[key] = []
                    } else {
                        target[key] = {}
                    }
                    deepCopy(target[key], source[key])
                } else {
                    target[key] = source[key]
                    //   target.key = source.key
                }
            }
        }
        // 复制的目标对象 target
        var obj2 = {}
        deepCopy(obj2, obj1);
        obj1.a.a.b = 2;



        


    </script>
</body>
</html>